﻿using System;
using System.Data;
using System.Text;
using YookingFileIO.Class;
using YookingCrypto.Class;
using YookingDBNormal.Class;
using YookingBizWQW.Class.Public;
using YookingKitBox.Class.Public;
using YookingSvrDBCall.Class.DBPub;
using YookingSvrDBCall.Class.DBLogic;
using YookingInterfaceAli.Class.OpenApi;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

namespace YookingBizWQW.Class.UsrLogin
{
    public class clsUserInfo
    {
        //注释：王庆文 2019年12月26日======================================================================
        //向YOOKING短信发送库中写入待发送的短信内容，然后由轮询接口每隔10秒将待发短信提交给通道接口
        public string SendSmsVeriftCode(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strJsonArray = "[{null}]";   //将要向数据库中写入的真实数据内容

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strJsonArray = strArray[0];
            }

            #endregion

            DataSet dsData = clsJConvert.JArryToDataSet(strJsonArray); //将Json数组转成DataSet

            clsWriteDB myWrite = new clsWriteDB(); //先根据strKeyFieldNameList判断数据是否存在，然后自动执行insert或者update
            strRtData = myWrite.WriteDBNormal_UseSYSCol("Data", "MSG_SMS_SENDMESSAGE", "RECEIVENUMBERSET,SMSCONTENT", "02120119901", dsData);

            return strRtData; //数据库操作的最终结果
        }

        //注释：王庆文 2021年04月05日===========================================================
        //用户登录系统的时候如果输入的用户名是手机号码、
        //或者身份证号码、或者短文号码，则根据这个号码找出该人的PersonID值。
        public string ConvertNumberToPersonID(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            //客户端输入的明文登录号码
            string strDeNumberValue = "000"; 

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strDeNumberValue = strArray[0];
            }

            #endregion

            #region 生成查询记录的SQL语句

            clsYkKeyData myVi = new clsYkKeyData(); //将明文数据加密之后，跟数据库里面的内容进行比较
            string strEnNumberValue = myVi.DesEncrypt(strDeNumberValue, "8565a40@abb65dd9613cddd4bd8f617fb.cn");

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine("     t.ISLOGINUSER, "); //是否置为登录用户
            sbQuerySQL.AppendLine("     t.PERSONCODE, ");  //人员编号
            sbQuerySQL.AppendLine("     t.PERSONID, ");    //人员ID
            sbQuerySQL.AppendLine(" 	a.USERNAME, ");    //登录用户名
            sbQuerySQL.AppendLine(" 	a.PASSWORD ");     //用户密码
            sbQuerySQL.AppendLine(" FROM SA_ORG_PERSONINFO t ");
            sbQuerySQL.AppendLine("   LEFT JOIN SA_USR_LOGININFO a ON a.PERSONID = t.PERSONID ");
            sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Data", "a.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND ");
            sbQuerySQL.AppendLine("      ( ");
            sbQuerySQL.AppendLine("        t.PERSONID = '" + strDeNumberValue + "' ");
            sbQuerySQL.AppendLine("        OR t.MOBILENUMBER = '" + strEnNumberValue + "' ");
            sbQuerySQL.AppendLine("        OR t.IDCARDNUMBER = '" + strEnNumberValue + "' ");
            sbQuerySQL.AppendLine("        OR t.WORKNUMBER = '" + strDeNumberValue + "' ");
            sbQuerySQL.AppendLine("        OR t.DWENNUMBER = '" + strEnNumberValue + "' ");
            sbQuerySQL.AppendLine("      ) ");

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString());

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类                                                   
            DataSet dsData = myDB.YookingExecuteDataSet("Data", sbQuerySQL.ToString());
            if (dsData != null && dsData.Tables.Count > 0 && dsData.Tables[0].Rows.Count > 0)
            {
                DataTable dtData = dsData.Tables[0]; //实例化DataTable
                string strEnPassWord = dtData.Rows[0]["PASSWORD"].ToString();

                //包含密码数据，则需要进行解码和转换操作
                if (!string.IsNullOrEmpty(strEnPassWord))
                {
                    clsSecret myDes = new clsSecret(); //将密文解密成明文
                    string strDePassWord = myDes.DecryptString(strEnPassWord);
                    string strBase64Str = clsBase64.Base64Encode(strDePassWord);

                    dtData.Rows[0]["PASSWORD"] = strBase64Str;
                    dsData.AcceptChanges(); //更新一下base64密码数据
                }

                //将DataSet转换成json数组文本内容，便于前后台交互和传输
                strRtData = clsJConvert.DataSetToJArray(dsData);
            }

            return strRtData; //数据库操作的最终结果
        }

        //注释：王庆文 2020年03月11日======================================================
        //根据用户名，查找并读取对应的登录密码数据
        public string GetUserPassword(string strB64RequestData)
        {
            string strRtData = "yooking null";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUserName = "0000"; //客户端登录用户名

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strUserName = strArray[0];
            }

            #endregion

            #region 生成查询记录的SQL语句

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine("     USERNAME, ");
            sbQuerySQL.AppendLine("     PASSWORD ");
            sbQuerySQL.AppendLine(" FROM SA_USR_LOGININFO t ");
            sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   and t.PERSONID = '" + strUserName + "' ");

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString());

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            DataSet ds= myDB.YookingExecuteDataSet("Data", sbQuerySQL.ToString());

            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
            {
                DataTable dt = ds.Tables[0];

                clsSecret myDes = new clsSecret(); //将密码翻译成明文
                string strEnPassword = dt.Rows[0]["PASSWORD"].ToString();
                string strDePassword = myDes.DecryptString(strEnPassword);

                strRtData = "[{";
                strRtData += "\"USERNAME\":\""+ strUserName + "\",";
                strRtData += "\"PASSWORD\":\"" + strDePassword + "\"";
                strRtData += "}]";
            }

            return strRtData; //数据库操作的最终结果
        }

        //注释：王庆文 2019年12月14日============================================================
        /// <summary>
        /// 根据登录用户名和密码，查询登录用户的全部个人信息，并记录访问日志
        /// </summary>
        /// <param name="strB64RequestData">BASE64格式参数数据，包含了用户名、登录密码</param>
        /// <returns>得到Sa_Org_PersonInfo表的行记录内容</returns>
        public async Task<string> GetSaPersonInfo(string strB64RequestData, string strRequestIP)
        {
            clsDBSpace myNull = new clsDBSpace(); //判断指定字段值是否为空
            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
          
            string strRtData = "{\"result\":\"yooking null\"}";
            string strTmpText = "no data"; //临时存放

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUserName = "000000"; //登录用户名
            string strPassWord = "123456"; //明文密码

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 2)
            {
                strUserName = strArray[0];
                strPassWord = strArray[1];
            }

            clsSecret myDes = new clsSecret(); //将明文进行加密
            string strEnPass = myDes.EncryptString(strPassWord);

            #endregion

            #region 先检查指定用户名是否存在的SQL语句

            StringBuilder sbSQL01 = new StringBuilder();
            sbSQL01.AppendLine(" SELECT ");
            sbSQL01.AppendLine("   PERSONID, ");
            sbSQL01.AppendLine("   USERNAME ");
            sbSQL01.AppendLine(" FROM ");
            sbSQL01.AppendLine("   SA_USR_LOGININFO t ");
            sbSQL01.AppendLine(" WHERE ");
            sbSQL01.AppendLine("   " + clsSQLSyntax.IsNullSQL("Data", "SYS_CANCELDATETIME"));
            sbSQL01.AppendLine(" AND USERNAME = '" + strUserName + "' ");

            #endregion

            strTmpText = myDB.YookingExecuteJson("Data", sbSQL01.ToString());
            if (strTmpText == strRtData)
            {
                strRtData = "{\"result\":\"用户【" + strUserName + "】不存在\"}";
            }
            else
            {
                #region 检查用户登录密码是否正确的SQL语句

                StringBuilder sbSQL02 = new StringBuilder();
                sbSQL02.AppendLine(" SELECT ");
                sbSQL02.AppendLine("   PERSONID, ");
                sbSQL02.AppendLine("   USERNAME ");
                sbSQL02.AppendLine(" FROM ");
                sbSQL02.AppendLine("   SA_USR_LOGININFO t ");
                sbSQL02.AppendLine(" WHERE ");
                sbSQL02.AppendLine("   " + clsSQLSyntax.IsNullSQL("Data", "SYS_CANCELDATETIME"));
                sbSQL02.AppendLine(" AND USERNAME = '" + strUserName + "' ");
                sbSQL02.AppendLine(" AND PASSWORD = '" + strEnPass + "' ");

                #endregion

                strTmpText = myDB.YookingExecuteJson("Data", sbSQL02.ToString());
                if (strTmpText == strRtData)
                {
                    strRtData = "{\"result\":\"用户【" + strUserName + "】，输入的登录密码不正确\"}";
                }
                else
                {
                    #region 然后在分析用户是否处于激活状态

                    StringBuilder sbSQL03 = new StringBuilder();
                    sbSQL03.AppendLine(" SELECT ");
                    sbSQL03.AppendLine("   t.PERSONID, ");
                    sbSQL03.AppendLine("   t.ISLOGINUSER ");
                    sbSQL03.AppendLine(" FROM ");
                    sbSQL03.AppendLine("   SA_ORG_PERSONINFO t ");
                    sbSQL03.AppendLine(" LEFT JOIN SA_USR_LOGININFO a ON a.PERSONID = t.PERSONID ");
                    sbSQL03.AppendLine(" WHERE ");
                    sbSQL03.AppendLine(" 	 " + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
                    sbSQL03.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Data", "a.SYS_CANCELDATETIME"));
                    sbSQL03.AppendLine(" AND t.ISLOGINUSER = '1' ");
                    sbSQL03.AppendLine(" AND a.USERNAME = '" + strUserName + "' ");
                    sbSQL03.AppendLine(" AND a.PASSWORD = '" + strEnPass + "' ");

                    #endregion

                    strTmpText = myDB.YookingExecuteJson("Data", sbSQL03.ToString());
                    if (strTmpText == strRtData)
                    {
                        strRtData = "{\"result\":\"用户【" + strUserName + "】的登录权限已被暂停，处于未激活状态\"}";
                    }
                    else
                    {
                        #region 然后在将用户个人的基本信息读取出来

                        StringBuilder sbQuerySQL = new StringBuilder();
                        sbQuerySQL.AppendLine(" SELECT ");
                        sbQuerySQL.AppendLine(" 	t.SYS_RECORDID, ");     //行记录ID  
                        sbQuerySQL.AppendLine(" 	t.PERSONCODE, ");       //人员编号
                        sbQuerySQL.AppendLine(" 	t.PERSONID, ");         //人员ID
                        sbQuerySQL.AppendLine(" 	t.ISLOGINUSER, ");      //是否置为登录用户
                        sbQuerySQL.AppendLine(" 	t.UKSERIALNUMBER, ");   //UK序列号
                        sbQuerySQL.AppendLine(" 	t.CASERIALNUMBER, ");   //CA序列号
                        sbQuerySQL.AppendLine(" 	t.REQUESTKEY, ");       //客户端请求KEY
                        sbQuerySQL.AppendLine(" 	t.REQUESTIP, ");        //客户端限制IP
                        sbQuerySQL.AppendLine(" 	t.MOBILEPHONEIMEI, ");  //手机串号
                        sbQuerySQL.AppendLine(" 	t.MOBILENUMBER, ");     //手机号码
                        sbQuerySQL.AppendLine(" 	t.IDLASTCODE, ");       //身份证尾号   
                        sbQuerySQL.AppendLine(" 	t.IDCARDNUMBER, ");     //身份证号码
                        sbQuerySQL.AppendLine(" 	t.WORKNUMBER, ");       //工作证号
                        sbQuerySQL.AppendLine(" 	t.WORKCODE, ");         //工作编码
                        sbQuerySQL.AppendLine(" 	t.FATHERNAME, ");       //父亲姓名
                        sbQuerySQL.AppendLine(" 	t.PERSONNAME, ");       //本人姓名
                        sbQuerySQL.AppendLine(" 	t.SEXTYPE, ");          //性别
                        sbQuerySQL.AppendLine(" 	t.NATION, ");           //民族
                        sbQuerySQL.AppendLine(" 	t.BIRTHDAY, ");         //出生日期
                        sbQuerySQL.AppendLine(" 	t.IDCARDADDRESS, ");    //户籍地址
                        sbQuerySQL.AppendLine(" 	t.LIVEADDRESS, ");      //居住地址
                        sbQuerySQL.AppendLine(" 	t.EDU_DEGREE, ");       //文化程度
                        sbQuerySQL.AppendLine(" 	t.EDU_FINISHSCHOOL, "); //毕业学校
                        sbQuerySQL.AppendLine(" 	t.EDU_FINISHDATE, ");   //毕业年月
                        sbQuerySQL.AppendLine(" 	t.EDU_PROFESSION, ");   //所学专业
                        sbQuerySQL.AppendLine(" 	t.PHONENUMBER, ");      //联系固话
                        sbQuerySQL.AppendLine(" 	t.NETNICKNAME, ");      //网络昵称
                        sbQuerySQL.AppendLine(" 	t.NETNICKSIGN, ");      //昵称个性签名
                        sbQuerySQL.AppendLine(" 	t.NETPENNAME, ");       //网络笔名
                        sbQuerySQL.AppendLine(" 	t.NETPENSIGN, ");       //笔名个性签名                                                  
                        sbQuerySQL.AppendLine(" 	t.QQNUMBER, ");         //QQ号码        
                        sbQuerySQL.AppendLine(" 	t.MICRONUMBER, ");      //微信号码       
                        sbQuerySQL.AppendLine(" 	t.MSNNUMBER, ");        //MSN号码
                        sbQuerySQL.AppendLine(" 	t.ALINUMBER, ");        //支付宝账号
                        sbQuerySQL.AppendLine(" 	t.EMAIL, ");            //电子邮件
                        sbQuerySQL.AppendLine(" 	t.DWENNUMBER, ");       //短文号
                        sbQuerySQL.AppendLine(" 	t.INTRODUCE, ");        //个人简历
                        sbQuerySQL.AppendLine(" 	t.MEMBERTYPE, ");       //会员类型
                        sbQuerySQL.AppendLine(" 	b.IMAGEENTITY AS PERSONICON "); //头像照片
                        sbQuerySQL.AppendLine(" FROM ");
                        sbQuerySQL.AppendLine(" 	SA_ORG_PERSONINFO t ");
                        sbQuerySQL.AppendLine(" LEFT JOIN SA_USR_LOGININFO a ON a.PERSONID = t.PERSONID ");
                        sbQuerySQL.AppendLine(" LEFT JOIN ( ");
                        sbQuerySQL.AppendLine(" 	SELECT ");
                        sbQuerySQL.AppendLine(" 		MAINTABLERECORDID, ");
                        sbQuerySQL.AppendLine(" 		SPECIALRELATENUMBER, ");
                        sbQuerySQL.AppendLine(" 		IMAGEENTITY ");
                        sbQuerySQL.AppendLine(" 	FROM MDA_PUBLICIMAGE ");
                        sbQuerySQL.AppendLine(" 	WHERE " + clsSQLSyntax.IsNullSQL("Data", "SYS_CANCELDATETIME"));
                        sbQuerySQL.AppendLine(" 	AND (UPPER(MAINTABLEDEFINEID)='SA_ORG_PERSONINFO' ");
                        sbQuerySQL.AppendLine(" 	     OR MAINTABLEDEFINEID='2017090917211696602120119901') ");
                        sbQuerySQL.AppendLine(" 	AND IMAGETYPE='009' ");
                        sbQuerySQL.AppendLine(" 	AND ORDERNUM = '1' ");
                        sbQuerySQL.AppendLine(" ) b ON b.MAINTABLERECORDID = t.SYS_RECORDID AND b.SPECIALRELATENUMBER = t.PERSONCODE ");
                        sbQuerySQL.AppendLine(" WHERE ");
                        sbQuerySQL.AppendLine(" 	" + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
                        sbQuerySQL.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Data", "a.SYS_CANCELDATETIME"));
                        sbQuerySQL.AppendLine(" AND t.ISLOGINUSER = '1' ");
                        sbQuerySQL.AppendLine(" AND a.USERNAME = '" + strUserName + "' ");
                        sbQuerySQL.AppendLine(" AND a.PASSWORD = '" + strEnPass + "' ");

                        #endregion

                        //从数据库中将信息读取出来
                        strRtData = myDB.YookingExecuteJson("Data", sbQuerySQL.ToString());

                        //将当前登录用户的登录访问信息写入到后台访问日志数据库中
                        await WriteUserLoginLog("未到获知单位编码阶段", "未到获知部门编码阶段", strUserName, strRequestIP);
                    }
                }
            }

            return strRtData; //用户登录检查，以及数据查询结果
        }

        //注释：王庆文 2020年03月11日==================================================
        //获取指定人员、在特定单位里的的StaffID等信息
        public string GetSaOrgStaffInfo(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUnitCode = "00000"; //单位编码
            string strDeptCode = "00000"; //部门编码
            string strUserName = "00000"; //登录用户

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 3)
            {
                strUnitCode = strArray[0];
                strDeptCode = strArray[1];
                strUserName = strArray[2];
            }

            #endregion

            #region 生成查询记录的SQL语句

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine("     t.STAFFID, ");
	        sbQuerySQL.AppendLine("     t.PERSONID, ");
            sbQuerySQL.AppendLine("     t.UNITCODE, ");
            sbQuerySQL.AppendLine("     t.DEPTCODE, ");
            sbQuerySQL.AppendLine("     t.POLICESTATIONCODE, ");
            sbQuerySQL.AppendLine("     t.COMMUNITYCODE, ");
            sbQuerySQL.AppendLine("     t.COMMITTEECODE, ");
            sbQuerySQL.AppendLine("     t.SERVICESTATIONCODE, ");
            sbQuerySQL.AppendLine("     t.SERVICESUBSTATIONCODE, ");
            sbQuerySQL.AppendLine("     a.POLICESTATIONNAME, ");
            sbQuerySQL.AppendLine("     b.COMMUNITYNAME, ");
            sbQuerySQL.AppendLine("     c.COMMITTEENAME, ");
            sbQuerySQL.AppendLine("     d.STATIONNAME AS SERVICESTATIONNAME, ");
            sbQuerySQL.AppendLine("     e.SUBSTATIONNAME AS SERVICESUBSTATIONNAME, ");
            sbQuerySQL.AppendLine(" 	f.DEPTNAME ");
            sbQuerySQL.AppendLine(" FROM SA_ORG_STAFFINFO t ");
            sbQuerySQL.AppendLine("   LEFT JOIN SA_ORG_POLICESTATION a ON a.UNITCODE = t.UNITCODE AND a.POLICESTATIONCODE = t.POLICESTATIONCODE ");
            sbQuerySQL.AppendLine("   LEFT JOIN SA_ORG_COMMUNITY b ON b.UNITCODE = t.UNITCODE AND b.COMMUNITYCODE = t.COMMUNITYCODE ");
            sbQuerySQL.AppendLine("   LEFT JOIN SA_ORG_COMMITTEE c ON c.UNITCODE = t.UNITCODE AND c.COMMITTEECODE = t.COMMITTEECODE ");
            sbQuerySQL.AppendLine("   LEFT JOIN SA_ORG_SERVICESTATION d ON d.UNITCODE = t.UNITCODE AND d.STATIONCODE = t.SERVICESTATIONCODE ");
            sbQuerySQL.AppendLine("   LEFT JOIN SA_ORG_SERVICESUBSTATION e ON e.UNITCODE = t.UNITCODE AND e.SUBSTATIONCODE = t.SERVICESUBSTATIONCODE ");
            sbQuerySQL.AppendLine("   LEFT JOIN SA_ORG_DEPARTMENT f ON f.UNITCODE = t.UNITCODE AND f.DEPTCODE = t.DEPTCODE ");
            sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND t.UNITCODE = '" + strUnitCode + "' ");
            sbQuerySQL.AppendLine(" AND t.DEPTCODE = '" + strDeptCode + "' ");
            sbQuerySQL.AppendLine(" AND t.PERSONID = '" + strUserName + "' ");

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString());

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            strRtData = myDB.YookingExecuteJson("Data", sbQuerySQL.ToString());

            return strRtData; //数据库查询结果
        }

        //注释：王庆文 2019年12月20日=============================================================
        //获取职员隶属的单位组织信息，包括单位、部门、派出所、社区、居委会、服务所、服务站。
        //同时得到该职员对应的角色授权信息，包括角色ID、父角色ID、角色名称、角色自定义系统名等
        public string GetSaOrgStaff_SaRuleRole(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strPersonID = "00000"; //人员ID

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strPersonID = strArray[0];
            }

            #endregion

            #region 生成查询记录的SQL语句

            clsDBSpace mySpace = new clsDBSpace(); //字典表空间名
            string strDictSapace = mySpace.GetDBSpaceName("Dict");

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine(" 	t.STAFFID, ");
            sbQuerySQL.AppendLine(" 	t.PERSONID, ");
            sbQuerySQL.AppendLine(" 	t.UNITCODE, ");
            sbQuerySQL.AppendLine(" 	t.DEPTCODE, ");
            sbQuerySQL.AppendLine(" 	t.POLICESTATIONCODE, ");
            sbQuerySQL.AppendLine(" 	t.COMMUNITYCODE, ");
            sbQuerySQL.AppendLine(" 	t.COMMITTEECODE, ");
            sbQuerySQL.AppendLine(" 	t.SERVICESTATIONCODE, ");
            sbQuerySQL.AppendLine(" 	t.SERVICESUBSTATIONCODE, ");
            sbQuerySQL.AppendLine(" 	a.UNITTYPE AS UNITTYPECODE, ");
            sbQuerySQL.AppendLine(" 	h.DICTMEMO AS UNITTYPENAME, ");
            sbQuerySQL.AppendLine(" 	a.UNITID, ");
            sbQuerySQL.AppendLine(" 	a.UNITLONGNAME, ");
            sbQuerySQL.AppendLine(" 	a.UNITSHORTNAME, ");
            sbQuerySQL.AppendLine(" 	a.OFFICEADDRESS, ");
            sbQuerySQL.AppendLine(" 	b.DEPTID, ");
            sbQuerySQL.AppendLine(" 	b.DEPTNAME, ");
            sbQuerySQL.AppendLine(" 	c.POLICESTATIONNAME, ");
            sbQuerySQL.AppendLine(" 	d.COMMUNITYNAME, ");
            sbQuerySQL.AppendLine(" 	e.COMMITTEENAME, ");
            sbQuerySQL.AppendLine(" 	f.STATIONNAME AS SERVICESTATIONNAME, ");
            sbQuerySQL.AppendLine(" 	g.SUBSTATIONNAME AS SERVICESUBSTATIONNAME, ");
            sbQuerySQL.AppendLine(" 	j.ROLEID, ");
            sbQuerySQL.AppendLine(" 	j.PARENTID, ");
            sbQuerySQL.AppendLine(" 	j.ROLENAME, ");
            sbQuerySQL.AppendLine(" 	j.TOPSYSTEMNAME, ");
            sbQuerySQL.AppendLine(" 	j.HOMEPAGEURL, ");
            sbQuerySQL.AppendLine(" 	j.MEMOINFO, ");
            sbQuerySQL.AppendLine(" 	k.IMAGEENTITY AS ROLELOGO ");
            sbQuerySQL.AppendLine(" FROM SA_ORG_STAFFINFO t ");
            sbQuerySQL.AppendLine(" LEFT JOIN SA_ORG_UNITINFO a ON a.UNITCODE = t.UNITCODE ");
            sbQuerySQL.AppendLine(" LEFT JOIN SA_ORG_DEPARTMENT b ON b.UNITCODE = t.UNITCODE AND b.DEPTCODE = t.DEPTCODE ");
            sbQuerySQL.AppendLine(" LEFT JOIN SA_ORG_POLICESTATION c ON c.UNITCODE = t.UNITCODE AND c.POLICESTATIONCODE = t.POLICESTATIONCODE ");
            sbQuerySQL.AppendLine(" LEFT JOIN SA_ORG_COMMUNITY d ON d.UNITCODE = t.UNITCODE AND d.COMMUNITYCODE = t.COMMUNITYCODE ");
            sbQuerySQL.AppendLine(" LEFT JOIN SA_ORG_COMMITTEE e ON e.UNITCODE = t.UNITCODE AND e.COMMITTEECODE = t.COMMITTEECODE ");
            sbQuerySQL.AppendLine(" LEFT JOIN SA_ORG_SERVICESTATION f ON f.UNITCODE = t.UNITCODE AND f.STATIONCODE = t.SERVICESTATIONCODE ");
            sbQuerySQL.AppendLine(" LEFT JOIN SA_ORG_SERVICESUBSTATION g ON g.UNITCODE = t.UNITCODE AND g.SUBSTATIONCODE = t.SERVICESUBSTATIONCODE ");
            sbQuerySQL.AppendLine(" LEFT JOIN " + strDictSapace + ".DICT_DWLX h ON h.DICTCODE = a.UNITTYPE ");
            sbQuerySQL.AppendLine(" LEFT JOIN SA_USR_USERACCREDIT i ON i.STAFFID = t.STAFFID ");
            sbQuerySQL.AppendLine(" LEFT JOIN SA_RULE_ROLEINFO j ON j.ROLEID = i.ROLEID ");
            sbQuerySQL.AppendLine(" LEFT JOIN ( ");
            sbQuerySQL.AppendLine(" 	SELECT ");
            sbQuerySQL.AppendLine(" 		MAINTABLERECORDID, ");
            sbQuerySQL.AppendLine(" 		SPECIALRELATENUMBER, ");
            sbQuerySQL.AppendLine(" 		IMAGEENTITY ");
            sbQuerySQL.AppendLine(" 	FROM MDA_PUBLICIMAGE ");
            sbQuerySQL.AppendLine(" 	WHERE " + clsSQLSyntax.IsNullSQL("Data", "SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" 	AND (UPPER(MAINTABLEDEFINEID) = 'SA_RULE_ROLEINFO' OR MAINTABLEDEFINEID='2017090917255562302120119901') ");
            //sbQuerySQL.AppendLine(" 	AND ORDERNUM = '0' ");
            sbQuerySQL.AppendLine(" ) k ON k.MAINTABLERECORDID = j.SYS_RECORDID AND k.SPECIALRELATENUMBER = j.TOPSYSTEMLOGO ");
            sbQuerySQL.AppendLine(" WHERE ");
            sbQuerySQL.AppendLine("       " + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Data", "a.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Data", "b.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Data", "c.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Data", "d.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Data", "e.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Data", "f.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Data", "g.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Dict", "h.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Data", "i.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND " + clsSQLSyntax.IsNullSQL("Data", "j.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND j.ROLEID IS NOT NULL ");
            sbQuerySQL.AppendLine("   AND t.PERSONID = '" + strPersonID + "' ");

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString());

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            strRtData = myDB.YookingExecuteJson("Data", sbQuerySQL.ToString());

            return strRtData; //数据库查询结果
        }

        //注释：王庆文 2019年12月20日==================================================================
        //得到指定角色ID对应的全部业务节点信息，包括父节点ID、本节点ID、业务树名称、对应页面URL等信息。
        //适合于2021年07月之前的全部Yooking菜单架构，不兼容新版的vue架构。
        public string GetSaRuleRoleAccredit_Html(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strRoleID = "00000"; //角色ID

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strRoleID = strArray[0];
            }

            #endregion

            #region 生成查询记录的SQL语句

            clsDBSpace mySpace = new clsDBSpace(); //系统表空间名
            string strSysSapace = mySpace.GetDBSpaceName("Sys");

            StringBuilder sbQuerySQL = new StringBuilder();

            //如果角色为YOOKING系统管理员，则取全部菜单
            if (strRoleID == "20130607162838216")
            {
                sbQuerySQL.AppendLine(" SELECT ");
                sbQuerySQL.AppendLine(" 	'" + strRoleID + "' AS ROLEID, ");
                sbQuerySQL.AppendLine(" 	'001,002,003,004,005,006,007,008,009,010,011,012,013,014,015,' AS OPERATERIGHTSET, ");
                sbQuerySQL.AppendLine(" 	'001' AS DATAVIEWLIMIT, ");
                sbQuerySQL.AppendLine(" 	a.PARENTNODEID, ");
                sbQuerySQL.AppendLine(" 	a.SELFNODEID, ");
                sbQuerySQL.AppendLine(" 	a.NODELEVEL, ");
                sbQuerySQL.AppendLine(" 	a.NODEORDER, ");
                sbQuerySQL.AppendLine(" 	a.NODETEXT, ");
                sbQuerySQL.AppendLine(" 	a.TOOLTIP, ");
                sbQuerySQL.AppendLine(" 	a.IMAGEURL, ");
                sbQuerySQL.AppendLine(" 	a.NAVIGATEURL, ");
                sbQuerySQL.AppendLine(" 	a.TARGETFRAME ");
                sbQuerySQL.AppendLine(" FROM " + strSysSapace + ".MNU_TREEDEFINE a ");
                sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Sys", "a.SYS_CANCELDATETIME"));      
            }
            else
            {
                sbQuerySQL.AppendLine(" SELECT ");
                sbQuerySQL.AppendLine(" 	t.ROLEID, ");
                sbQuerySQL.AppendLine(" 	t.OPERATERIGHTSET, ");
                sbQuerySQL.AppendLine(" 	t.DATAVIEWLIMIT, ");
                sbQuerySQL.AppendLine(" 	a.PARENTNODEID, ");
                sbQuerySQL.AppendLine(" 	a.SELFNODEID, ");
                sbQuerySQL.AppendLine(" 	a.NODELEVEL, ");
                sbQuerySQL.AppendLine(" 	a.NODEORDER, ");
                sbQuerySQL.AppendLine(" 	a.NODETEXT, ");
                sbQuerySQL.AppendLine(" 	a.TOOLTIP, ");
                sbQuerySQL.AppendLine(" 	a.IMAGEURL, ");
                sbQuerySQL.AppendLine(" 	a.NAVIGATEURL, ");
                sbQuerySQL.AppendLine(" 	a.TARGETFRAME ");
                sbQuerySQL.AppendLine(" FROM SA_RULE_ROLEACCREDIT t ");
                sbQuerySQL.AppendLine(" LEFT JOIN " + strSysSapace + ".MNU_TREEDEFINE a ON a.SELFNODEID = t.TREESELFNODEID ");
                sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
                sbQuerySQL.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Sys", "a.SYS_CANCELDATETIME"));
                sbQuerySQL.AppendLine(" AND t.TREETYPE='HTML' ");
                sbQuerySQL.AppendLine(" AND t.ROLEID = '" + strRoleID + "' ");       
            }

            //以前easyUI风格的老架构的菜单不读取
            sbQuerySQL.AppendLine(" AND a.NODETYPE='01' "); //只取PC端的tree数据
            sbQuerySQL.AppendLine(" AND a.SYS_INPUTDATETIME>='2019-12-01 00:00:00' ");
            sbQuerySQL.AppendLine(" ORDER BY a.PARENTNODEID,a.NODEORDER ");

            #endregion

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            strRtData = myDB.YookingExecuteJson("Data", sbQuerySQL.ToString());

            return strRtData; //数据库查询结果
        }

        //注释：王庆文 2021年07月14日==================================================================
        //得到指定角色ID对应的全部业务节点信息，
        //包括父节点ID、本节点ID、业务树名称、对应页面URL等信息。
        //适合于2021年07月之后的新版VUE架构，不兼容老版的html架构。
        public string GetSaRuleRoleAccredit_Vue(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strRoleID = "00000"; //角色ID

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strRoleID = strArray[0];
            }

            #endregion

            #region 生成查询记录的SQL语句

            clsDBSpace mySpace = new clsDBSpace(); //系统表空间名
            string strSysSapace = mySpace.GetDBSpaceName("Sys");

            StringBuilder sbQuerySQL = new StringBuilder();

            //如果角色为YOOKING系统管理员，则取全部菜单
            if (strRoleID == "20130607162838216")
            {
                sbQuerySQL.AppendLine(" SELECT ");
                sbQuerySQL.AppendLine(" 	'" + strRoleID + "' AS ROLEID, ");
                sbQuerySQL.AppendLine(" 	'001,002,003,004,005,006,007,008,009,010,011,012,013,014,015,' AS OPERATERIGHTSET, ");
                sbQuerySQL.AppendLine(" 	'001' AS DATAVIEWLIMIT, ");
                sbQuerySQL.AppendLine("     a.NODE_TYPE, ");
                sbQuerySQL.AppendLine("     a.PARENT_ID, ");
                sbQuerySQL.AppendLine("     a.NODE_ID, ");
                sbQuerySQL.AppendLine("     a.NODE_LEVEL, ");
                sbQuerySQL.AppendLine("     a.NODE_ORDER, ");
                sbQuerySQL.AppendLine("     a.TR_TITLE, ");
                sbQuerySQL.AppendLine("     a.PAGE_TYPE, ");
                sbQuerySQL.AppendLine("     a.PAGE_NAME, ");
                sbQuerySQL.AppendLine("     a.FILE_PATH, ");
                sbQuerySQL.AppendLine("     a.ROUTE_PATH, ");
                sbQuerySQL.AppendLine("     a.ICO_TYPE, ");
                sbQuerySQL.AppendLine("     a.ICO_SRC, ");
                sbQuerySQL.AppendLine("     a.HTMLPAGE, ");
                sbQuerySQL.AppendLine("     a.ROOT_DISPLAY, ");
                sbQuerySQL.AppendLine("     a.SUB_DISPLAY, ");
                sbQuerySQL.AppendLine("     a.SYS_RECORDID, ");
                sbQuerySQL.AppendLine(" 	b.IMAGEENTITY "); //图标照片数据
                sbQuerySQL.AppendLine(" FROM " + strSysSapace + ".VUE_TREEDEFINE a ");
                sbQuerySQL.AppendLine(" LEFT JOIN ( ");
                sbQuerySQL.AppendLine("     SELECT ");
                sbQuerySQL.AppendLine(" 	    MAINTABLERECORDID, ");
                sbQuerySQL.AppendLine(" 	    SPECIALRELATENUMBER, ");
                sbQuerySQL.AppendLine(" 	    IMAGEENTITY ");
                sbQuerySQL.AppendLine("     FROM MDA_PUBLICIMAGE ");
                sbQuerySQL.AppendLine("     WHERE " + clsSQLSyntax.IsNullSQL("Data", "SYS_CANCELDATETIME"));
                sbQuerySQL.AppendLine("     AND (UPPER(MAINTABLEDEFINEID)='VUE_TREEDEFINE' ");
                sbQuerySQL.AppendLine("         OR MAINTABLEDEFINEID='20210719152850715902189') ");
                sbQuerySQL.AppendLine("     AND IMAGETYPE='003' ");
                sbQuerySQL.AppendLine("     AND ORDERNUM = '01' ");
                sbQuerySQL.AppendLine("     ) b ON b.MAINTABLERECORDID = a.SYS_RECORDID AND b.SPECIALRELATENUMBER = a.ICO_SRC ");
                sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Sys", "a.SYS_CANCELDATETIME"));
            }
            else
            {
                sbQuerySQL.AppendLine(" SELECT ");
                sbQuerySQL.AppendLine(" 	t.ROLEID, ");
                sbQuerySQL.AppendLine(" 	t.OPERATERIGHTSET, ");
                sbQuerySQL.AppendLine(" 	t.DATAVIEWLIMIT, ");
                sbQuerySQL.AppendLine("     a.NODE_TYPE, ");
                sbQuerySQL.AppendLine("     a.PARENT_ID, ");
                sbQuerySQL.AppendLine("     a.NODE_ID, ");
                sbQuerySQL.AppendLine("     a.NODE_LEVEL, ");
                sbQuerySQL.AppendLine("     a.NODE_ORDER, ");
                sbQuerySQL.AppendLine("     a.TR_TITLE, ");
                sbQuerySQL.AppendLine("     a.PAGE_TYPE, ");
                sbQuerySQL.AppendLine("     a.PAGE_NAME, ");
                sbQuerySQL.AppendLine("     a.FILE_PATH, ");
                sbQuerySQL.AppendLine("     a.ROUTE_PATH, ");
                sbQuerySQL.AppendLine("     a.ICO_TYPE, ");
                sbQuerySQL.AppendLine("     a.ICO_SRC, ");
                sbQuerySQL.AppendLine("     a.HTMLPAGE, ");
                sbQuerySQL.AppendLine("     a.ROOT_DISPLAY, ");
                sbQuerySQL.AppendLine("     a.SUB_DISPLAY, ");
                sbQuerySQL.AppendLine("     a.SYS_RECORDID, ");
                sbQuerySQL.AppendLine(" 	b.IMAGEENTITY "); //图标照片数据
                sbQuerySQL.AppendLine(" FROM SA_RULE_ROLEACCREDIT t ");
                sbQuerySQL.AppendLine(" LEFT JOIN " + strSysSapace + ".VUE_TREEDEFINE a ON a.NODE_ID = t.TREESELFNODEID ");
                sbQuerySQL.AppendLine(" LEFT JOIN ( ");
                sbQuerySQL.AppendLine("     SELECT ");
                sbQuerySQL.AppendLine(" 	    MAINTABLERECORDID, ");
                sbQuerySQL.AppendLine(" 	    SPECIALRELATENUMBER, ");
                sbQuerySQL.AppendLine(" 	    IMAGEENTITY ");
                sbQuerySQL.AppendLine("     FROM MDA_PUBLICIMAGE ");
                sbQuerySQL.AppendLine("     WHERE " + clsSQLSyntax.IsNullSQL("Data", "SYS_CANCELDATETIME"));
                sbQuerySQL.AppendLine("     AND (UPPER(MAINTABLEDEFINEID)='VUE_TREEDEFINE' ");
                sbQuerySQL.AppendLine("         OR MAINTABLEDEFINEID='20210719152850715902189') ");
                sbQuerySQL.AppendLine("     AND IMAGETYPE='003' ");
                sbQuerySQL.AppendLine("     AND ORDERNUM = '01' ");
                sbQuerySQL.AppendLine("     ) b ON b.MAINTABLERECORDID = a.SYS_RECORDID AND b.SPECIALRELATENUMBER = a.ICO_SRC ");
                sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
                sbQuerySQL.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Sys", "a.SYS_CANCELDATETIME"));
                sbQuerySQL.AppendLine(" AND t.TREETYPE='VUE' ");
                sbQuerySQL.AppendLine(" AND t.ROLEID = '" + strRoleID + "' ");
            }

            sbQuerySQL.AppendLine(" AND a.NODE_TYPE='01' "); //只取PC端的tree数据
            sbQuerySQL.AppendLine(" ORDER BY a.PARENT_ID,a.NODE_ORDER ");

            #endregion

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            DataSet dsTree = myDB.YookingExecuteDataSet("Data", sbQuerySQL.ToString());

            if (dsTree != null && dsTree.Tables.Count > 0 && dsTree.Tables[0].Rows.Count > 0)
            {
                //循环递归按照vue格式生成功能节点tree的路由数据
                strRtData = clsVueRoute.ReprintVueRoute(dsTree);

                //递归循环后没有生成任何route数据
                if (strRtData == "[]" || strRtData == "[{}]")
                {
                    strRtData = "{\"result\":\"yooking null\"}";
                }
            }
            else
            {
                strRtData = "{\"result\":\"yooking null\"}";
            }

            return strRtData; //数据库查询结果
        }

        //注释：王庆文 2019年12月20日===============================================================
        //根据客户端传过来的单位编码，获取该单位的详细信息
        public async Task<string> GetSaOrgUnitInfo(string strB64RequestData, string strRequestIP)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUnitCode = "00000"; //单位编码
            string strUnitDept = "00000"; //部门编码
            string strUserName = "00000"; //登录用户

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 3)
            {
                strUnitCode = strArray[0];
                strUnitDept = strArray[1];
                strUserName = strArray[2];
            }

            #endregion

            #region 生成查询记录的SQL语句

            clsDBSpace mySpace = new clsDBSpace(); //字典表空间名
            string strDictSapace = mySpace.GetDBSpaceName("Dict");

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine(" 	t.COUNTRY AS COUNTRYCODE, ");
            sbQuerySQL.AppendLine(" 	a.DICTMEMO AS COUNTRYNAME, ");
            sbQuerySQL.AppendLine(" 	t.AREA AS AREACODE, ");
            sbQuerySQL.AppendLine(" 	b.DICTMEMO AS AREANAME, ");
            sbQuerySQL.AppendLine(" 	t.PROVINCE AS PROVINCECODE, ");
            sbQuerySQL.AppendLine(" 	c.DICTMEMO AS PROVINCENAME, ");
            sbQuerySQL.AppendLine(" 	t.CITY AS CITYCODE, ");
            sbQuerySQL.AppendLine(" 	d.DICTMEMO AS CITYNAME, ");
            sbQuerySQL.AppendLine(" 	t.TOWN AS TOWNCODE, ");
            sbQuerySQL.AppendLine(" 	e.DICTMEMO AS TOWNNAME, ");
            sbQuerySQL.AppendLine(" 	t.UNITTYPE AS UNITTYPECODE, ");
            sbQuerySQL.AppendLine(" 	f.DICTMEMO AS UNITTYPENAME, ");
            sbQuerySQL.AppendLine(" 	t.UNITCODE, ");
            sbQuerySQL.AppendLine(" 	t.UNITLONGNAME, ");
            sbQuerySQL.AppendLine(" 	t.LONGNAMESPELL, ");
            sbQuerySQL.AppendLine(" 	t.UNITSHORTNAME, ");
            sbQuerySQL.AppendLine(" 	t.SHORTNAMESPELL, ");
            sbQuerySQL.AppendLine(" 	t.REGISTERMONEY, ");
            sbQuerySQL.AppendLine(" 	t.REGISTERNUMBER, ");
            sbQuerySQL.AppendLine(" 	t.REGISTERADDRESS, ");
            sbQuerySQL.AppendLine(" 	t.OFFICEADDRESS, ");
            sbQuerySQL.AppendLine(" 	t.BUSINESSSCOPE, ");
            sbQuerySQL.AppendLine(" 	t.CREATEDATE, ");
            sbQuerySQL.AppendLine(" 	t.VALIDDATEBEGIN, ");
            sbQuerySQL.AppendLine(" 	t.VALIDDATEEND, ");
            sbQuerySQL.AppendLine(" 	t.LEGALPERSONNAME, ");
            sbQuerySQL.AppendLine(" 	t.LEGALPERSONPHONE, ");
            sbQuerySQL.AppendLine(" 	t.LEGALPERSONIDNUM, ");
            sbQuerySQL.AppendLine(" 	t.TOUCHPERSONNAME, ");
            sbQuerySQL.AppendLine(" 	t.TOUCHPERSONPHONE, ");
            sbQuerySQL.AppendLine(" 	t.UNITPHONE, ");
            sbQuerySQL.AppendLine(" 	t.UNITFAX, ");
            sbQuerySQL.AppendLine(" 	t.UNITWEBSITE, ");
            sbQuerySQL.AppendLine(" 	t.UNITQQNUMBER, ");
            sbQuerySQL.AppendLine(" 	t.UNITID, ");
            sbQuerySQL.AppendLine(" 	t.STAFFCOUNT AS STAFFCOUNTCODE, "); //员工人数代码
            sbQuerySQL.AppendLine(" 	g.DICTMEMO AS STAFFCOUNTMEMO, ");   //员工人数描述
            sbQuerySQL.AppendLine(" 	t.CERTFLAG, ");
            sbQuerySQL.AppendLine(" 	t.OFFICELONGITUDE, ");
            sbQuerySQL.AppendLine(" 	t.OFFICELATITUDE ");
            sbQuerySQL.AppendLine(" FROM SA_ORG_UNITINFO t ");
            sbQuerySQL.AppendLine(" LEFT JOIN " + strDictSapace + ".DICT_GJDQ a ON a.DICTCODE = t.COUNTRY ");
            sbQuerySQL.AppendLine(" LEFT JOIN " + strDictSapace + ".DICT_GJDQ b ON b.DICTCODE = t.AREA ");
            sbQuerySQL.AppendLine(" LEFT JOIN " + strDictSapace + ".DICT_XZQH_2018 c ON c.DICTCODE = t.PROVINCE ");
            sbQuerySQL.AppendLine(" LEFT JOIN " + strDictSapace + ".DICT_XZQH_2018 d ON d.DICTCODE = t.CITY ");
            sbQuerySQL.AppendLine(" LEFT JOIN " + strDictSapace + ".DICT_XZQH_2018 e ON e.DICTCODE = t.TOWN ");
            sbQuerySQL.AppendLine(" LEFT JOIN " + strDictSapace + ".DICT_DWLX f ON f.DICTCODE = t.UNITTYPE ");
            sbQuerySQL.AppendLine(" LEFT JOIN " + strDictSapace + ".DICT_DWEN_STAFFCOUNT g ON g.DICTCODE = t.STAFFCOUNT ");
            sbQuerySQL.AppendLine(" WHERE ");
            sbQuerySQL.AppendLine(" 	" + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Dict", "a.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Dict", "b.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Dict", "c.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Dict", "d.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Dict", "e.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Dict", "f.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND " + clsSQLSyntax.IsNullSQL("Dict", "g.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND t.UNITCODE = '" + strUnitCode + "' ");

            #endregion

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            strRtData = myDB.YookingExecuteJson("Data", sbQuerySQL.ToString());

            //将当前登录成功的用户访问情况保存到后台访问日志数据库中
            await WriteUserLoginLog(strUnitCode, strUnitDept, strUserName, strRequestIP);

            return strRtData; //数据库查询结果
        }

        //注释：王庆文 2019年12月17日===================================================================================
        /// <summary>
        /// 将当前登录用户的登录访问信息写入到后台访问日志数据库中
        /// </summary>
        /// <param name="strUnitCode">登录单位编码</param>
        /// <param name="strDeptCode">登录部门编码</param> 
        /// <param name="strUserName">登录用户名</param>
        /// <param name="strRouteIP">发出请求的客户端IP地址</param>
        private Task<string> WriteUserLoginLog(string strUnitCode, string strDeptCode, string strUserName, string strRouteIP)
        {
            return Task.Run(() =>
            {
                string strCurTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //此刻的日期时间

                //淘宝的API接口有调用次数限制，同一服务器不可长久的使用
                //clsTaoBaoIP myTaoBao = new clsTaoBaoIP(); //得到IP属性数据        
                //string strIPJson = myTaoBao.GetIPJsonAttribute(strRouteIP);

                clsPcOnlineIP myPcOl = new clsPcOnlineIP(); //得到IP属性数据
                string strIPJson = myPcOl.GetIPJsonAttribute(strRouteIP);
                strIPJson = strIPJson.Replace("\"", "”"); //处理冲突的字符

                clsCommon myDef = new clsCommon();
                clsShare myConvert = new clsShare(); //根据登录用户名，翻译出用户姓名
                string strPersonName = myConvert.GetNewColValue("Data", "SA_ORG_PERSONINFO", "PERSONID", strUserName, "PERSONNAME");
                strPersonName = myDef.NullOrEmptyToDefaultValue(strPersonName, "unknow name"); //未找到，则赋默认姓名

                var strJsonArray = "[{"; //封装成json格式的大文本
                strJsonArray += "\"CLIENTTYPE\":\"9\","; //终端类型,1=电脑终端，2=移动终端，9=其它
                strJsonArray += "\"LOGINTYPE\":\"1\",";  //登录类型,1=在线登录，0=离线登录
                strJsonArray += "\"UNITCODE\":\"" + strUnitCode + "\",";     //所属单位
                strJsonArray += "\"DEPTCODE\":\"" + strDeptCode + "\",";     //所属部门
                strJsonArray += "\"USERNAME\":\"" + strUserName + "\",";     //登录ID号
                strJsonArray += "\"PERSONNAME\":\"" + strPersonName + "\","; //用户姓名
                strJsonArray += "\"LOGINTIME\":\"" + strCurTime + "\",";     //登录时间
                strJsonArray += "\"ROUTEIP\":\"" + strRouteIP + "\",";       //路由IP地址
                strJsonArray += "\"ROUTEDATA\":\"" + strIPJson + "\",";      //路由IP解析
                strJsonArray += "\"PRIVATEIP\":\"0.0.0.0\","; //本机IP地址
                strJsonArray += "\"PRIVATEMAC\":\"0.0.0.0\""; //本机MAC地址     
                strJsonArray += "}]";

                DataSet dsData = clsJConvert.JArryToDataSet(strJsonArray); //将Json数组转成DataSet

                clsWriteDB myDB = new clsWriteDB(); //在数据库中记录本次客户端的访问情况
                myDB.WriteDBNormal_UseSYSCol("Data", "OP_USERLOGINLOG", "", strUserName, dsData);

                return "finish"; //异步业务处理结束
            });
        }

        //注释：王庆文 2019年12月13日==========================================================
        /// <summary>
        /// 对指定用户strUserName进行登录密码的修改操作
        /// </summary>
        /// <param name="strB64RequestData">修改密码用到的BASE64格式的各种参数数据</param>
        /// <returns>密码修改成功与否的提示信息</returns>
        public string ChangeUserPassword(string strB64RequestData)
        {
            string strRtData = "now start change password";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUserName = "00000"; //用户名
            string strOldPass = "123456"; //明文旧密码
            string strNewPass = "123456"; //明文新密码

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 3)
            {
                strUserName = strArray[0];
                strOldPass = strArray[1];
                strNewPass = strArray[2];
            }

            #endregion

            #region 生成修改密码的SQL语句

            clsSecret myDes = new clsSecret(); //将明文进行加密
            string strEnOldPass = myDes.EncryptString(strOldPass);
            string strEnNewPass = myDes.EncryptString(strNewPass);

            StringBuilder sbUpdateSQL = new StringBuilder();
            sbUpdateSQL.AppendLine(" update SA_USR_LOGININFO set PASSWORD='" + strEnNewPass + "' ");
            sbUpdateSQL.AppendLine(" where " + clsSQLSyntax.IsNullSQL("Data", "SYS_CANCELDATETIME"));
            sbUpdateSQL.AppendLine("   AND USERNAME='" + strUserName + "' ");
            sbUpdateSQL.AppendLine("   AND PASSWORD='" + strEnOldPass + "' ");

            #endregion

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库类
            object iCount = myDB.YookingExecuteNonQuery("Data", sbUpdateSQL.ToString());
            if (Convert.ToInt32(iCount) > 0)
            {
                strRtData = "用户【" + strUserName + "】的密码修改成功";
            }
            else
            {
                strRtData = "用户【" + strUserName + "】的密码修改失败";
            }

            return strRtData; //数据库记录的更新结果
        }

        //注释：王庆文 2020年03月11日==========================================================
        /// <summary>
        /// 对指定用户strUserName进行登录密码的修改操作
        /// </summary>
        /// <param name="strB64RequestData">重置密码用到的BASE64格式的各种参数数据</param>
        /// <returns>密码重置成功与否的提示信息</returns>
        public string ResetUserPassword(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUserName = "00000"; //用户名
            string strNewPass = "123456"; //明文新密码

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 2)
            {
                strUserName = strArray[0];
                strNewPass = strArray[1];
            }

            #endregion

            #region 生成修改密码的SQL语句

            clsSecret myDes = new clsSecret(); //将明文进行加密
            string strEnNewPass = myDes.EncryptString(strNewPass);

            StringBuilder sbUpdateSQL = new StringBuilder();
            sbUpdateSQL.AppendLine(" update SA_USR_LOGININFO set PASSWORD='" + strEnNewPass + "' ");
            sbUpdateSQL.AppendLine(" where " + clsSQLSyntax.IsNullSQL("Data", "SYS_CANCELDATETIME"));
            sbUpdateSQL.AppendLine("   AND USERNAME='" + strUserName + "' ");

            #endregion

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库类
            object iCount = myDB.YookingExecuteNonQuery("Data", sbUpdateSQL.ToString());
            if (Convert.ToInt32(iCount) > 0)
            {
                strRtData = "用户【" + strUserName + "】的密码重置成功";
            }
            else
            {
                strRtData = "用户【" + strUserName + "】的密码重置失败";
            }

            return strRtData; //数据库记录的更新结果
        }

        //注释：王庆文 2020年07月27日==============================================================
        //用户通过手机扫码登录二维码之后，扫码得到登录请求ID，连同用户名和密码一起提交到服务器端。
        //并将信息写入到后台数据库，存在则更新之，否则直接insert
        public string WriteQRCcodeLoginInfo(string strB64RequestData)
        {
            string strRtResult = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            //PC端页面初始化时生成的手机扫码登录请求的RequestID
            string strQRCodeRequestID = "00"; //登陆请求ID
            string strEnLoginNumber = "0000"; //扫码人的登录账号（密文）
            string strB64PassWord = "000000"; //扫码者的密码（密文）

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 3)
            {
                strQRCodeRequestID = strArray[0];
                strEnLoginNumber = strArray[1];
                strB64PassWord = strArray[2];
            }

            #endregion

            #region 生成Write记录的json格数数据数组

            //将登录账号解密成明文
            clsYkKeyData myKey = new clsYkKeyData();//实例化DES加解密类库
            string strDeLoginNumber = myKey.DesDecrypt(strEnLoginNumber, "8565a40@abb65dd9613cddd4bd8f617fb.cn");
            if (string.IsNullOrEmpty(strDeLoginNumber)) {
                strDeLoginNumber = strEnLoginNumber; //解密失败，则使用原值
            }

            //对登录密码进行二次简单的混淆和加密处理
            string strEnPassWord = strB64PassWord + "Ak6.=L/Du9";

            //写入数据的日期时间
            string strCurTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            JArray objJArray = new JArray();
            JObject objJObject = new JObject();
            objJObject.Add("REQUESTID", strQRCodeRequestID); //请求ID
            objJObject.Add("LOGINNUM", strDeLoginNumber);    //用户账号(明文)
            objJObject.Add("PASSWORD", strEnPassWord);       //密码
            objJObject.Add("SCANQRTIME", strCurTime);        //扫码时间
            objJObject.Add("READSTATUS", "0");               //阅读状态
            objJObject.Add("READTIME", "");                  //阅读时间
            objJObject.Add("OTHERMEMO", "");                 //其他备注

            objJArray.Add(objJObject); //将json数据装入到数组对象中

            #endregion

            DataSet dsData = clsJConvert.JArryToDataSet(objJArray.ToString()); //将Json转成DataSet

            clsWriteDB myWrite = new clsWriteDB(); 
            string strKeyColSet = "REQUESTID"; //重值判断，先判断数据是否存在，根据判断结果自动执行insert或者update
            strRtResult = myWrite.WriteDBNormal_UseSYSCol("Data", "Sa_Usr_LoginQrCode", strKeyColSet, "02120119901", dsData);

            return strRtResult; //数据库操作结果
        }

        //注释：王庆文 2020年07月26日===============================================================================
        //手机端用户扫码之后，会把二维码中扫描到的RequestID、以及用户名和密码三个信息一起写入到后台服务器中。
        //PC端函数不断的向服务器查询是否存在该RequestID的用户登录信息，如果存在，则连同用户名和密码一起读取过去。
        //然后根据刚刚读取到的用户名、密码数据，自动进行数据认证及系统登录操作。
        public string GetQRCcodeLoginInfo(string strB64RequestData)
        {
            string strRtData = "yooking null";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            //PC端页面初始化时生成的手机扫码登录请求的RequestID
            string strQRCodeRequestID = "0000000"; //登陆请求ID

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strQRCodeRequestID = strArray[0];
            }

            #endregion

            #region 生成查询记录的SQL语句

            //ReadStatus=0表示未读，ReadStatus=0表示已读
            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine("     t.REQUESTID, ");
            sbQuerySQL.AppendLine("     t.LOGINNUM, ");
            sbQuerySQL.AppendLine("     t.PASSWORD, ");
            sbQuerySQL.AppendLine("     t.SCANQRTIME, ");
            sbQuerySQL.AppendLine("     t.READSTATUS, ");
            sbQuerySQL.AppendLine("     t.READTIME, ");
            sbQuerySQL.AppendLine("     t.OTHERMEMO ");
            sbQuerySQL.AppendLine(" FROM SA_USR_LOGINQRCODE t ");
            sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND t.REQUESTID = '" + strQRCodeRequestID + "' ");
            sbQuerySQL.AppendLine(" AND t.READSTATUS = '0' ");

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString());

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            strRtData = myDB.YookingExecuteJson("Data", sbQuerySQL.ToString());

            return strRtData; //数据库查询结果
        }

        //注释：王庆文 2020年07月27日==================================================================
        //update本次登录二维码的读取状态，防止反复调用登录公共方法
        public string UpdateQRCodeScanStatus(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"0\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            //PC端页面初始化时生成的手机扫码登录请求的RequestID
            string strQRCodeRequestID = "0000000"; //登陆请求ID

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strQRCodeRequestID = strArray[0];
            }

            #endregion

            #region 生成更新记录的SQL语句

            //ReadStatus=0表示未读，ReadStatus=0表示已读
            string strCurTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            StringBuilder sbUpdateSQL = new StringBuilder();
            sbUpdateSQL.AppendLine(" UPDATE SA_USR_LOGINQRCODE SET ");
            sbUpdateSQL.AppendLine("     READSTATUS = '1', ");
            sbUpdateSQL.AppendLine("     READTIME = '" + strCurTime + "' ");
            sbUpdateSQL.AppendLine(" WHERE ");
            sbUpdateSQL.AppendLine("     REQUESTID = '" + strQRCodeRequestID + "' ");

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbUpdateSQL.ToString());

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            object objResult = myDB.YookingExecuteNonQuery("Data", sbUpdateSQL.ToString());

            //数据更新处理结果（受影响的行数）
            strRtData = "{\"result\":\"" + objResult.ToString() + "\"}";
            return strRtData; //数据库操作结果
        }

        //注释：王庆文 2021年07月31日===================================================
        //获取指定APP、H5、小程序的短文接入授权信息
        public string Get_AppInterface(string strB64RequestData)
        {
            string strRtData = "yooking null";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strAppID = "0000000"; //用户的应用ID

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strAppID = strArray[0];
            }

            #endregion

            #region 生成查询记录的SQL语句

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine("     t.UNITCODE, ");    //申请单位
            sbQuerySQL.AppendLine("     t.PERSONCODE, ");  //申请人员
            sbQuerySQL.AppendLine("     t.REGTIME, ");     //申请时间
            sbQuerySQL.AppendLine("     t.APPTYPE, ");     //应用程序类型，H5App=短文H5程序，MiniApp=短文小程序
            sbQuerySQL.AppendLine("     t.APPNAME, ");     //应用程序描述
            sbQuerySQL.AppendLine("     t.APPID, ");       //AppID
            sbQuerySQL.AppendLine("     t.APPKEY, ");      //App密钥
            sbQuerySQL.AppendLine("     t.DOMAINNAME, ");  //授权域名
            sbQuerySQL.AppendLine("     t.OTHERMEMO, ");   //其他备注
            sbQuerySQL.AppendLine("     t.SYS_RECORDID "); //本行记录ID
            sbQuerySQL.AppendLine(" FROM SA_APP_INTERFACE t ");
            sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "t.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine(" AND t.APPID = '" + strAppID + "' ");

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString());

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            strRtData = myDB.YookingExecuteJson("Data", sbQuerySQL.ToString());

            return strRtData; //数据库查询结果
        }




    }
}
